/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.util.referenceSrc;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Hashtable;

/**
 *
 * @author SDS
 */
public class Util {

   /**<PRE>
  * TODO:
  * @param serverUrl : 호출할 URL
  * @param hs : 파라미터를 넘길때 사용할 해쉬테이블
  * @param bBinary : true-> 바이너리 모드로 호출 false->ascii 모드로 호출
  * @return
  * @throws java.net.MalformedURLException
  * </PRE>
  */
   public byte[] callUrlConnect( String serverUrl,Hashtable hs,boolean bBinary) throws java.net.MalformedURLException {

   URL url = null;
   URLConnection connection = null;

   //binary
   OutputStream outStream = null;
   InputStream inStream = null;
   BufferedInputStream bufInStream = null;

   //text
   Writer writer = null;
   java.io.Reader reader = null;
   BufferedReader buf = null;

   String output = null;
   StringBuffer sb = new StringBuffer();

   byte[] bufferResult = null;

   try
   {


    url = new URL(serverUrl);

    connection = url.openConnection();

    connection.setDoOutput(true); //post방식:true
    connection.setDoInput(true); //데이타 첨부되는 경우
    // 헤더 셋팅- 웹서버마다 헤더정보가 부족하면 405에러를 반환하기도 한다.
    connection.setRequestProperty("Accept","*/*");
    connection.setRequestProperty("Accept-Charset","euc-kr");
 //   connection.setRequestProperty("host",getHostIP());
    connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; i-NavFourF; .NET CLR 1.1.4322)");


    outStream = connection.getOutputStream();


    //일반 text 파일 요청시
    // 서버로 데이타를 보낼때.. writer를 사용
    writer = new OutputStreamWriter(outStream);
    //DataOutputStream doutput = new DataOutputStream(outStream);

    // form data 를 넣어줄때
    if(hs != null)
    {
     String sKey = null;
     String param = "";
     for (Enumeration e = hs.keys() ; e.hasMoreElements() ;)
     {
      sKey = (String)e.nextElement();
      param += sKey+"="+(String)hs.get(sKey)+"&";
     }


     writer.write(param);
     //doutput.writeBytes(param);

  //   writer.write("&pnum1="+URLEncoder.encode(pnum1));
  //   writer.write("&pnum2="+URLEncoder.encode(pnum2));
    }


    writer.flush();// 내부버퍼에 있는 모든 데이타를 전송하도록 한다.
    writer.close();

 //   doutput.flush();
 //   doutput.close();

    outStream.close();

 //   doutput = null;
    writer = null;
    outStream = null;

 //   int response_code = connection.getResponseCode();

    //보낸데이타를 받는다.
    inStream = connection.getInputStream();


    //text 읽을때..
    if(bBinary == false)
    {
     //스트링 버퍼로 변환하기 위해서는 아래처럼 한다.
     //euc-kr로 안하면 euc-kr로 인코딩 안된 문서는 utf-8로 읽어들이면서 sun.io.MalformedInputException을 발생



      //euc-kr하면 xml등을 호출시 유니코드 한글이 ???로 나온다.
     //reader = new InputStreamReader(inStream,"euc-kr");







    //cp949로 하면 euc-kr도 커버하면서 xml 유니코드 한글도 잘 나온다.
     reader = new InputStreamReader(inStream, "cp949");
     buf = new BufferedReader(reader);

  //   log("----- callUrl Result START---------------------\n");
     while((output = buf.readLine()) != null)
     {
  //    log(output+"\n");
      if(!output.equals(""))
      {
       output.trim();
       sb.append(output+"\r\n");
      }
     }

     bufferResult = sb.toString().getBytes();

    }else
    {
     //binary 로 읽을 때..(이미지,swf등을 다운로드 할때사용하면 됨)
     bufInStream = new BufferedInputStream(inStream);

     int bufferOffset = 0;
     int nReadSize = 0;
     int bufferCapacity = bufInStream.available()+1;

     System.out.println("--------------------------------------");
     System.out.println("[binary] 초기버퍼사이즈 = "+bufferCapacity);

     bufferResult = new byte[bufferCapacity];

  //   log("----- callUrl Result START---------------------\n");
 //    while((i = bufInStream.read(bResult)) != -1);

     //BufferedInputStream 가 끝이 아닐때까지 돌면서 버퍼에 채우고 채워진 버퍼를 화면에 출력
     while((nReadSize = bufInStream.read(bufferResult,
              bufferOffset,
              bufferCapacity-bufferOffset)) != -1)
     {
      bufferOffset += nReadSize;

      System.out.println("[binary] nReadSize = "+nReadSize+"/ bufferOffset = "+bufferOffset);

      if(bufferOffset >= bufferCapacity)
      {
       System.out.println("[binary] 버퍼확장 bufferSize = bufferCapacity "+bufferOffset+" = "+bufferCapacity);
       //bufferResult 를 확장한다.
       bufferCapacity *= 2;
       byte[] newBuffer = new byte[bufferCapacity];
       System.arraycopy(bufferResult,0,newBuffer,0,bufferOffset);

       //reference 를 변경
       bufferResult = newBuffer;
      }
     }
     System.out.println("[binary] 최종 읽은 사이즈 = "+bufferResult.length);
     System.out.println("--------------------------------------");
 /*
  * binary file 생성 test 소스 - stream으로 기록해야한다.
     File newFile = new File("/home/webroot/download/logo2.gif");

     BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(newFile));

     bout.write(bResult);

     bout.flush();
     bout.close();
 */
    }

   } catch(java.net.ConnectException e) {
    sb = null;
    sb = new StringBuffer();
    sb.append("CONNECTION_ERR | "+e.toString());

   }catch(java.net.SocketException e)
   {
    sb = null;
    sb = new StringBuffer();
    sb.append(e.toString());

   }catch(java.io.IOException e)
   {
    sb = null;
    sb = new StringBuffer();
    sb.append(e.toString());

   }finally
   {

    try
    {

 //    System.out.println(" 통신 스트림 객체 해제중...");

     if(writer != null)
     {
      writer.close();
      writer = null;
     }

     if(outStream != null)
     {
      outStream.close();
      outStream = null;
     }

     if(inStream != null)
     {
      inStream.close();
      inStream = null;
     }

     if(reader != null)
     {
      reader.close();
      reader = null;
     }

     if(buf != null)
     {
      buf.close();
      buf = null;
     }

     if(bufInStream != null)
     {
      bufInStream.close();
      bufInStream = null;
     }

    }catch(java.io.IOException e1)
    {
     e1.printStackTrace();
    }
   }

   return bufferResult;
  }

}
